#pragma once

#include "PKB.h"

// A PKB stub for unit testing of QueryEvaluator.
// Currently assumes the following SIMPLE source code:
// Procedure MyProc {
//1.	x = y;
//2.	y = z;
//3.	a = b;
//4.	b = c;
// }
// Currently implements the following STUB functions: 
// getLines, getFollows, getFollowStar, getFollowedBy, getFollowedByStar, isFollows, isFollowStar
// Assumes the following relationships:
// Follows(1,2), Follows(2,3), Follows(3,4)
class PKBStubForFollowTest : public PKB {
	private:
	public:
		PKBStubForFollowTest(void);
		~PKBStubForFollowTest(void);
	
		// Currently assumes the following SIMPLE source code:
		// Procedure MyProc {
		//1.	x = y;
		//2.	y = z;
		//3.	a = b;
		//4.	b = c;
		// }
		virtual const Type::List::Line& getLinesByEntity(Type::Entity::Line);
		// Assumes the following Follows relationships:
		// Follows(1,2), Follows(2,3), Follows(3,4)
		// e.g. getFollows(2) will return 3.
		virtual Type::Index::Line getFollows(Type::Index::Line);
		// Assumes the following Follows relationships:
		// Follows*(1,2), Follows*(1,3), Follows*(1,4) Follows*(2,3), Follows*(2,4), Follows*(3,4)
		// e.g. getFollows(2) will return a vector [3, 4].
		virtual Type::List::Line getFollowStar(Type::Index::Line);
		// Assumes the following Follows relationships:
		// Follows(1,2), Follows(2,3), Follows(3,4).
		// e.g. getFollowedBy(2) will return 1.
		virtual Type::Index::Line getFollowedBy(Type::Index::Line);
		// Assumes the following Follows relationships:
		// Follows*(1,2), Follows*(1,3), Follows*(1,4) Follows*(2,3), Follows*(2,4), Follows*(3,4)
		// e.g. getFollows(3) will return a vector [1, 2].
		virtual Type::List::Line getFollowedByStar(Type::Index::Line);
		// Assumes the following Follows relationships:
		// Follows(1,2), Follows(2,3), Follows(3,4)
		// e.g. isFollows(1,2) returns true, and isFollows(1,3) returns false.
		virtual bool isFollows(Type::Index::Line, Type::Index::Line);
		// Assumes the following Follows relationships:
		// Follows*(1,2), Follows*(1,3), Follows*(1,4) Follows*(2,3), Follows*(2,4), Follows*(3,4)
		// e.g. isFollowStar(1,3) returns true, and isFollowStar(2,1) returns false.
		virtual bool isFollowStar(Type::Index::Line, Type::Index::Line);
};

